home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / progem.arc / sources.arc / GEMC11.C < prev    next >
Text File  |  1987-10-05  |  4KB  |  129 lines

  1. >>>>>>>>>>>>>>> Sample code for initializing User Objects <<<<<<<<<<<<<<<<
  2.  
  3. GLOBAL    USERBLK extobjs[MAX_OBJS];    /* APPLBLK defined in OBDEFS.H    */
  4. GLOBAL    WORD    n_extobjs;        /* Set MAX_OBJS to total user   */
  5.                     /* objects in resource        */
  6.  
  7.     VOID
  8. obj_init()                /* Scan whole resource for user   */
  9.     {                /* objects.  Uses map_tree()      */
  10.     LONG    tree, obspec;        /* from GEMCL5.C          */
  11.     WORD    itree, i, obj;
  12.  
  13.     n_extobjs = 0;            /* Replace TREE0 with your first  */
  14.                     /* tree, TREEN with the last      */
  15.     for (itree = TREE0; itree <= TREEN; itree++)
  16.         {
  17.         rsrc_gaddr(R_TREE, itree, &tree);
  18.         map_tree(tree, ROOT, NIL, fix_obj);
  19.         }
  20.     }
  21.  
  22.     WORD
  23. fix_obj(tree, obj)            /* Code to check and fix up    */
  24.     LONG    tree;            /* a user defined object    */
  25.     WORD    obj;
  26.     {
  27.     WORD    hibyte;
  28.  
  29.     hibyte = LWGET(OB_TYPE(obj)) & 0xff00;        /* check extended */
  30.     if (!hibyte)                    /* type - if none */
  31.         return (TRUE);                /* ignore object  */
  32.     extobjs[n_extobjs].ub_code = dr_code;        /* set drawcode   */
  33.     extobjs[n_extobjs].ub_parm = LLGET(OB_SPEC(obj)); /* copy obspec  */
  34.     LLSET(OB_SPEC(obj), ADDR(&extobjs[n_extobjs]));   /* point obspec */
  35.     LWSET(OB_TYPE(obj), G_USERDEF | hibyte);    /* to userblk &   */
  36.     n_extobjs++;                    /* patch type     */
  37.     return (TRUE);
  38.     }
  39.     
  40. >>>>>>>>>>>>>>>>>>>>>> Sample User Object Drawing Code <<<<<<<<<<<<<<<<<<<<
  41. >>>>>>>>>>>>>>>>>>>>>> Implements Rounded Box based    <<<<<<<<<<<<<<<<<<<<
  42. >>>>>>>>>>>>>>>>>>>>>> on G_BOX type               <<<<<<<<<<<<<<<<<<<<
  43.  
  44.     WORD
  45. dr_code(pb)                /* Sample user object drawing   */
  46.     PARMBLK    *pb;            /* code.  Caution: NOT portable */
  47.     {                /* to Intel small data models   */
  48.     LONG    tree, obspec;
  49.     WORD    slct, flip, type, ext_type, flags;
  50.     WORD    pxy[4];
  51.     WORD    bgc, interior, style, bdc, width, chc;
  52.     
  53.     tree = pb->pb_tree;
  54.     obspec = LLGET(pb->pb_parm);    /* original obspec from USERBLK  */
  55.     ext_type = LHIBT(LWGET(OB_TYPE(pb->pb_obj)));
  56.     slct = SELECTED & pb->pb_currstate;
  57.     flip = SELECTED & (pb->pb_currstate ^ pb->pb_prevstate);
  58.     set_clip(TRUE, &pb->pb_xc);    /* These two routines in GEMCL9.C */
  59.     grect_to_array(&pb->pb_x, pxy);    
  60.  
  61.     switch (ext_type) {
  62.         case 1:            /* Rounded box       */
  63.                     /* Crack color word  */
  64.             get_colrwd(obspec, &bgc, &style, &interior,
  65.                 &bdc, &width, &chc);
  66.                     /* For select effect, use char color */
  67.             if (slct)    /* In place of background         */
  68.                 bgc = chc;
  69.                     /* Fill in background             */
  70.             rr_fill(MD_REPLACE, (width? 0: 1), bgc, interior, 
  71.                 style, pxy);
  72.                     /* Do perimeter if needed         */
  73.                     /* rr_perim is in GEMCL9.C         */
  74.             if (width && !flip)
  75.                 {
  76.                 pxy[0] -= width; pxy[2] += width; 
  77.                 rr_perim(MD_REPLACE, bdc, FIS_SOLID, width, pxy);
  78.                 }
  79.             break;
  80.         default:        /* Add more types here            */
  81.             break;
  82.         }
  83.     return (0);
  84.     }
  85.  
  86.     VOID                /* Cracks the obspec color word    */
  87. get_colrwd(obspec, bgc, style, interior, bdc, width, chc)
  88.     LONG    obspec;
  89.     WORD    *bgc, *style, *interior, *bdc, *width, *chc, *chmode;
  90.     {
  91.     WORD    colorwd;
  92.  
  93.     colorwd = LLOWD(obspec);
  94.     *bgc = colorwd & 0xf;
  95.     *style = (colorwd & 0x70) >> 4;
  96.     if ( !(*style) )
  97.         *interior = 0;
  98.     else if (*style == 7)
  99.         *interior = 1;
  100.     else if (colorwd & 0x80)    /* HACK: Uses character writing mode */
  101.         *interior = 3;        /* bit to select alternate interior  */
  102.     else                /* styles!                 */
  103.         *interior = 2;
  104.     *bdc = (colorwd & 0xf000) >> 12;
  105.  
  106.     *width = LHIWD(obspec) & 0xff;
  107.     if (*width > 127)
  108.         *width = 256 - *width;
  109.  
  110.     if (*width && !(*width & 0x1))        /* VDI only renders odd */
  111.         (*width)--;            /* widths!        */
  112.  
  113.     *chc = (colorwd & 0x0f00) >> 8;        /* used for select effect */
  114.     }
  115.  
  116.     VOID                /* Fill a rounded rectangle    */
  117. rr_fill(mode, perim, color, interior, style, pxy)
  118.     WORD    mode, perim, color, style, interior, *pxy;
  119.     {
  120.     vswr_mode(vdi_handle, mode);
  121.     vsf_color(vdi_handle, color);
  122.     vsf_style(vdi_handle, style);
  123.     vsf_interior(vdi_handle, interior);
  124.     vsf_perimeter(vdi_handle, perim);
  125.     v_rfbox(vdi_handle, pxy);
  126.     }
  127.  
  128.  
  129.